home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / util / snap_1_4 / part01 / source / misc.c < prev    next >
C/C++ Source or Header  |  1990-02-11  |  3KB  |  119 lines

  1. /* Auto: make
  2. */
  3.  
  4. #define SCREENTOP\
  5.    (screen->TopEdge << ((screen->ViewPort.Modes & LACE)? 0: 1))
  6.  
  7. IMPORT struct SnapRsrc *SnapRsrc;
  8. IMPORT struct IntuitionBase *IntuitionBase;
  9. IMPORT struct MinList CachedWindows;
  10.  
  11. struct Screen *WhichScreen()
  12. {
  13.     REGISTER struct Screen *screen;
  14.     Forbid();
  15.     screen = IntuitionBase->FirstScreen;
  16.     while (screen && IntuitionBase->MouseY < SCREENTOP) {
  17.         screen = screen->NextScreen;
  18.     }
  19.     if (screen == NULL) {     /* Shouldn't happen */
  20.         screen = IntuitionBase->ActiveScreen;
  21.     }
  22.     Permit();
  23.     return screen;
  24. }
  25.  
  26. struct Window *WhichWindow(screen)
  27. struct Screen *screen;
  28. {
  29.     struct Layer *layer;
  30.     layer = (struct Layer *)WhichLayer(&screen->LayerInfo,
  31.       (LONG)screen->MouseX, (LONG)screen->MouseY);
  32.     if (layer) {
  33.         return (struct Window *)layer->Window;
  34.     } else {
  35.         return NULL;
  36.     }
  37. }
  38.  
  39. VOID FreePlanes(bm, width, height)
  40. struct BitMap *bm;
  41. LONG width, height;
  42. {
  43.     SHORT i;
  44.     for (i=0; i < bm->Depth; i++) {
  45.         if (bm->Planes[i]) {
  46.             FreeRaster(bm->Planes[i], width, height);
  47.         }
  48.     }
  49. }
  50.  
  51. WORD AllocPlanes(bm, width, height)
  52. struct BitMap *bm;
  53. LONG width, height;
  54. {
  55.     WORD i;
  56.     for (i=0; i < bm->Depth; i++) {
  57.         bm->Planes[i] = NULL;
  58.     }
  59.     for (i=0; i < bm->Depth; i++) {
  60.         if (!(bm->Planes[i] = AllocRaster(width, height))) {
  61.             return 0;
  62.         }
  63.         BltClear(bm->Planes[i], RASSIZE(width, height), NULL);
  64.     }
  65.     return 1;
  66. }
  67.  
  68. VOID CacheWindow(Win, xoff, yoff, fw, fh)
  69. struct Window *Win;
  70. LONG xoff;
  71. LONG yoff;
  72. SHORT fw;
  73. SHORT fh;
  74. {
  75.     struct CacheWindow *cw;
  76.     if (!(cw = AllocMem((LONG)sizeof(struct CacheWindow),
  77.       MEMF_PUBLIC|MEMF_CLEAR))) {
  78.         return;
  79.     }
  80.     cw->Window = Win;
  81.     cw->xoff = xoff;
  82.     cw->yoff = yoff;
  83.     cw->fw = fw;
  84.     cw->fh = fh;
  85.     AddHead((struct List *)&CachedWindows, (struct Node *)cw);
  86.     if (SnapRsrc->CacheSize > 0) {
  87.         --SnapRsrc->CacheSize;
  88.     } else {
  89.         FreeMem(RemTail((struct List *)&CachedWindows),
  90.           (LONG)sizeof(struct CacheWindow));
  91.     }
  92. }
  93.  
  94. struct CacheWindow *GetCachedWindow(Screen, Win)
  95. struct Screen *Screen;
  96. struct Window *Win;
  97. {
  98.     struct CacheWindow *cw = (struct CacheWindow *)CachedWindows.mlh_Head;
  99.  
  100.     while (cw->Node.mln_Succ) {
  101.         if (cw->Window == Win) {
  102.             LONG LockVal = LockIBase(0L);
  103.             REGISTER struct Window *w = Screen->FirstWindow;
  104.             while (w && w != Win) {
  105.                 w = w->NextWindow;
  106.             }
  107.             UnlockIBase(LockVal);
  108.             if (!w) {
  109.                 return NULL;
  110.             }
  111.             Remove((struct Node *)cw);
  112.             AddHead((struct List *)&CachedWindows, (struct Node *)cw);
  113.             return cw;
  114.         }
  115.         cw = (struct CacheWindow *)cw->Node.mln_Succ;
  116.     }
  117.     return NULL;
  118. }
  119.